package cn.bookcycle.panda.pay.util;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.bookcycle.panda.pay.constant.BusinessData;
import cn.bookcycle.panda.pay.constant.NameData;

/**
 * 响应工具类
 * 
 * @author liufenglin
 * @date 2018年1月29日
 */
public class ServiceResponse implements Runnable {
	/**日志*/
	private static final Logger logger = LoggerFactory.getLogger(ServiceRequest.class);

	/** 支付成功后，微信发来的xml格式消息 */
	private String requestBody;
	
	public ServiceResponse(String requestBody) {
		this.requestBody = requestBody;
	}
	
	
	/**
	 * 
	 * 
	 * @throws DocumentException
	 * @throws JSONException 
	 */
	public void msgHandler() throws DocumentException, JSONException {
		if (requestBody != null) {
			// 解析xml格式的通知消息 
			Document document = DocumentHelper.parseText(requestBody);
			// 获取根节点
			Element root = document.getRootElement();
			// 获取mch_Id（商户ID）、out_trade_no（订单号）
			String mchId = root.elementText(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.MCH_ID));
			String account = BusinessData.MCH_ID_ACCOUNT_MAP.get(mchId);
			String tradeNo = root.elementText(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.TRADE_NO));
			// 根据account（商户账户）、out_trade_no（订单号）数据库查询调用者的notifyUrl
			String notifyUrl = DaoUtil.getNotifyUrl(account, tradeNo);
			logger.warn("mchId:{}  tradeNo:{}  notifyUrl:{}",mchId, tradeNo, notifyUrl);
			// 封装status（状态码）、out_trade_no（订单号）为返回json消息
			JSONObject jsonObject = new JSONObject();
			jsonObject.put(NameData.STATUS, BusinessData.PAIED_CODE);
			jsonObject.put(NameData.TRADE_NO, tradeNo);
			String json = jsonObject.toString();
			logger.warn("向后台返回的json格式已经支付消息:{}", json);
			// 向后台发送，已经支付的异步回调信息
			Request.sendPost(notifyUrl, json);
			// TODO 2018年3月14日 21:01:41 记录支付成功信息到数据库
		} else {
			logger.warn("微信发过来的支付结果消息是null！！！！！");
		}
		
	}

	@Override
	public void run() {
		
		try {
			msgHandler();
		} catch (DocumentException e1) {
			logger.warn("由Document解析异常导致,处理微信回调消息线程异常！！！！！");
			e1.printStackTrace();
		} catch (JSONException e1) {
			logger.warn("由JSON解析异常导致,处理微信回调消息线程异常！！！！！");
		}
	}
}
